package org.jeecg.common.util;

import com.alibaba.fastjson.JSONObject;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20190711.models.SendStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aliyuncs.exceptions.ClientException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


/**
 * Created on 17/6/7.
 * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类，直接通过
 * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
 * 工程依赖了1个腾讯云短信服务的sdk jar包
 * 1:tencentcloud-sdk-java.jar
 * 备注:Demo工程编码采用UTF-8
 * 国际短信发送请勿参照此DEMO
 */

@Component
public class DySmsHelper {

	private final static Logger logger=LoggerFactory.getLogger(DySmsHelper.class);


    //此处需要替换成开发者自己的AK(在腾讯云访问控制台寻找)，在application.yml配置文件中配置好
    @Value("${jeecg.sms.secretId}")
    private String secretId;
    @Value("${jeecg.sms.secretKey}")
    private String secretKey;
    @Value("${jeecg.sms.appid}")
    private String appid;
    @Value("${jeecg.sms.signName}")
    private String signName;

    /**
     *
     * @param phoneNumbers
     * @param templateParamJson
     * @param dySmsEnum
     * @return result
     * @throws ClientException
     */
    public  SendStatus[] sendSms(String[] phoneNumbers,JSONObject templateParamJson, DySmsEnum dySmsEnum) throws ClientException {
        SendStatus[] result = null;
        validateParam(templateParamJson,dySmsEnum);
        /* 必要步骤：
         * 实例化一个认证对象，入参需要传入腾讯云账户密钥对 secretId 和 secretKey
         * 本示例采用从环境变量读取的方式，需要预先在环境变量中设置这两个值
         * 您也可以直接在代码中写入密钥对，但需谨防泄露，不要将代码复制、上传或者分享给他人
         * CAM 密钥查询：https://console.cloud.tencent.com/cam/capi
         */
        Credential cred = new Credential(secretId, secretKey);
        // 实例化一个 http 选项，可选，无特殊需求时可以跳过
        HttpProfile httpProfile = new HttpProfile();
        // 设置代理
//        httpProfile.setProxyHost("http://134.175.187.61");
//        httpProfile.setProxyPort(8088);
        /* SDK 默认使用 POST 方法。
         * 如需使用 GET 方法，可以在此处设置，但 GET 方法无法处理较大的请求 */
        httpProfile.setReqMethod("POST");
        httpProfile.setConnTimeout(60);
        httpProfile.setEndpoint("sms.tencentcloudapi.com");
        /* 非必要步骤:
         * 实例化一个客户端配置对象，可以指定超时时间等配置 */
        ClientProfile clientProfile = new ClientProfile();
        /* SDK 默认用 TC3-HMAC-SHA256 进行签名
         * 非必要请不要修改该字段 */
        clientProfile.setSignMethod("HmacSHA256");
        clientProfile.setHttpProfile(httpProfile);
        /* 实例化 SMS 的 client 对象
         * 第二个参数是地域信息，可以直接填写字符串 ap-guangzhou，或者引用预设的常量 */
        SmsClient client = new SmsClient(cred, "ap-guangzhou",clientProfile);
        /* 实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数
         * 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
         * 属性可能是基本类型，也可能引用了另一个数据结构
         * 推荐使用 IDE 进行开发，可以方便地跳转查阅各个接口和数据结构的文档说明 */
        SendSmsRequest req = new SendSmsRequest();
        req.setSmsSdkAppid(appid);
        req.setSign(signName);
        req.setSessionContext("xxx");
        req.setSenderId(null);
        req.setPhoneNumberSet(phoneNumbers);
        String templateId = dySmsEnum.getTemplateCode();
        req.setTemplateID(templateId);
        String[] templateParams;
        String code = templateParamJson.getString("code");
        Integer minutes = templateParamJson.getInteger("minutes");
        if(minutes==null){
            templateParams = new String[]{code};
        }else{
            templateParams = new String[]{code,String.valueOf(minutes)};
        }
        req.setTemplateParamSet(templateParams);
        /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
         * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
        try {
            SendSmsResponse res = client.SendSms(req);
            // 输出 JSON 格式的字符串回包
            System.out.println(SendSmsResponse.toJsonString(res));
            // 可以取出单个值，您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义
            System.out.println(res.getRequestId());
            result = res.getSendStatusSet();
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        }
        return result;

    }


    private void validateParam(JSONObject templateParamJson,DySmsEnum dySmsEnum) {
    	String keys = dySmsEnum.getKeys();
    	String [] keyArr = keys.split(",");
    	for(String item :keyArr) {
    		if(!templateParamJson.containsKey(item)) {
    			throw new RuntimeException("模板缺少参数："+item);
    		}
    	}
    }

}
